/**
 * 会话管理器
 * 用于管理用户会话和待处理任务
 */

class SessionManager {
    private sessionId: string | null = null
    private pendingTasks: Set<string> = new Set()
    private isPageLeaving: boolean = false

    /**
     * 获取或创建会话ID
     */
    getSessionId(): string {
        if (!this.sessionId) {
            this.sessionId = this.generateSessionId()
        }
        return this.sessionId
    }

    /**
     * 生成会话ID
     */
    private generateSessionId(): string {
        return `session_${Date.now()}_${Math.random().toString(36).substring(7)}`
    }

    /**
     * 添加待处理任务
     */
    addPendingTask(taskId: string): void {
        this.pendingTasks.add(taskId)
    }

    /**
     * 移除待处理任务
     */
    removePendingTask(taskId: string): void {
        this.pendingTasks.delete(taskId)
    }

    /**
     * 获取所有待处理任务
     */
    getPendingTasks(): string[] {
        return Array.from(this.pendingTasks)
    }

    /**
     * 清空所有待处理任务
     */
    clearPendingTasks(): void {
        this.pendingTasks.clear()
    }

    /**
     * 检查是否有待处理任务
     */
    hasPendingTasks(): boolean {
        return this.pendingTasks.size > 0
    }

    /**
     * 重置会话
     */
    resetSession(): void {
        this.sessionId = null
        this.pendingTasks.clear()
    }

    /**
     * 取消会话的所有任务
     */
    async cancelSessionTasks(): Promise<void> {
        if (!this.sessionId || this.pendingTasks.size === 0) {
            return
        }

        try {
            // 调用API取消会话任务
            const response = await fetch('/api/v1/sessions/cancel', {
                method: 'POST',
                headers: {
                    'Content-Type': 'application/json'
                },
                body: JSON.stringify({
                    session_id: this.sessionId
                })
            })

            if (response.ok) {
                console.log(`✅ 已取消会话 ${this.sessionId} 的所有任务`)
                this.clearPendingTasks()
            } else {
                console.error('❌ 取消会话任务失败:', await response.text())
            }
        } catch (error) {
            console.error('❌ 取消会话任务异常:', error)
        }
    }

    /**
     * 初始化页面离开监听器
     * 当用户刷新页面或离开页面时，自动取消所有待处理任务
     */
    initPageLeaveListener(): void {
        // 监听页面离开事件
        window.addEventListener('beforeunload', (event) => {
            if (this.pendingTasks.size > 0 && !this.isPageLeaving) {
                this.isPageLeaving = true
                console.log(`🔄 页面即将离开，取消 ${this.pendingTasks.size} 个待处理任务`)

                // 使用 sendBeacon 发送取消请求（更可靠）
                const data = JSON.stringify({
                    session_id: this.sessionId
                })

                if (navigator.sendBeacon) {
                    navigator.sendBeacon('/api/v1/sessions/cancel', data)
                } else {
                    // 降级方案：同步请求
                    try {
                        const xhr = new XMLHttpRequest()
                        xhr.open('POST', '/api/v1/sessions/cancel', false)
                        xhr.setRequestHeader('Content-Type', 'application/json')
                        xhr.send(data)
                    } catch (error) {
                        console.error('❌ 同步取消任务失败:', error)
                    }
                }
            }
        })

        // 监听页面隐藏事件（移动端）
        document.addEventListener('visibilitychange', () => {
            if (document.visibilityState === 'hidden' && this.pendingTasks.size > 0) {
                console.log(`📱 页面隐藏，取消 ${this.pendingTasks.size} 个待处理任务`)
                this.cancelSessionTasks()
            }
        })

        console.log('✅ 页面离开监听器已初始化')
    }
}

// 导出单例实例
export const sessionManager = new SessionManager()

